package br.uece.comp.paa.util;

import java.text.DecimalFormat;
import java.util.List;

import javax.swing.JButton;

import br.uece.comp.paa.ProjetoApp;
import br.uece.comp.paa.entity.GeradorArvoreMinima;
import br.uece.comp.paa.entity.Varredura;
import br.uece.comp.paa.entity.beb.BranchAndBound;
import br.uece.comp.paa.entity.param.Retorno;
import br.uece.comp.paa.gui.RelatorioAGMPanel;
import br.uece.comp.paa.gui.action.GerarRelatorioAction;
import br.uece.comp.paa.gui.action.PararAction;

public class ExecucaoThread extends Thread {

	private Varredura gerador;

	private int grauMaximo;

	private int qtdArvoreMaximo;

	private double custoMaximo;

	private RelatorioAGMPanel panel;

	public static double inicio;

	private JButton botao;

	public ExecucaoThread(GeradorArvoreMinima gerador, int grauMaximo,
			int qtdArvoreMaximo, double custoMaximo, RelatorioAGMPanel panel) {
		this.gerador = (Varredura) gerador;
		this.grauMaximo = grauMaximo;
		this.qtdArvoreMaximo = qtdArvoreMaximo;
		this.custoMaximo = custoMaximo;
		this.panel = panel;
		botao = panel.getBotaoGerar();
	}

	public void run() {
		inicio = System.currentTimeMillis();
		
		botao.setAction(new PararAction());
		botao.setText("Parar");
		botao.setEnabled(true);
		
		List<Retorno> agms = gerador.gerar(grauMaximo, qtdArvoreMaximo, custoMaximo);

		showMessage(agms);
	}

	public void parar() {
		gerador.parar();
	}

	public void showMessage(List<Retorno> agms) {
		String opcao;
		if(gerador instanceof BranchAndBound) {
			opcao = "Branch and Bound";
		} else {
			opcao = "Exaustiva";
		}
		
		String msg = "ALGORITMO " + opcao;
		for (int i = 0; i < agms.size(); i++) {
			msg += '\n' + "AGM Nº " + (i + 1);
			msg += '\n' + "Tempo total de geraço: "
					+ agms.get(i).resultado.getTempo();
			msg += '\n'
					+ "Custo da solução: "
					+ new DecimalFormat().format(agms.get(i).resultado
							.getCusto()) + '\n';
		}

		msg += '\n' + "Clique em EXIBIR para verificar a árvore nº 1 graficamente sobre o grafo!";

		panel.getTextPane().setText(msg);

		ProjetoApp.app.setAgms(agms);

		botao.setAction(new GerarRelatorioAction());
		botao.setText("Gerar");
		botao.setEnabled(true);	
	}
}
